﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;

namespace DocTes.Jerarquias
{
	/// <summary>
	///  Implementación de IHierarchyData para hacer binding a un treeview desde entidades Linq.
	/// </summary>
	public class JerarquiaCarpetaHierarchyData : IHierarchyData
	{
		private IEntidadLinqJerarquiaCarpeta _jerarquiaCarpeta;
		private IFabricaHierarchyData _fabricaInterna;
		private IFabricaJerarquiaHierarchicalEnumerable _fabricaJerarquiaEnumerable;
		/// <summary>
		/// Contructor por defecto de un nodo usando la entidad Linq.
		/// </summary>
		/// <param name="jerarquiaCarpeta">Objeto Linq de JerarquiaCarpeta</param>
		/// <param name="fabricaHierarchyData">Fábrica de objetos que implementen IHierarchydata</param>
		/// <param name="fabricaJerarquiaEnumerable">Fábrica de objetos que implementen IHierarchicalenumerable</param>
		public JerarquiaCarpetaHierarchyData(IEntidadLinqJerarquiaCarpeta jerarquiaCarpeta,
														 IFabricaHierarchyData fabricaHierarchyData,
														 IFabricaJerarquiaHierarchicalEnumerable fabricaJerarquiaEnumerable)
		{
			_jerarquiaCarpeta = jerarquiaCarpeta;
			_fabricaInterna = fabricaHierarchyData;
			_fabricaJerarquiaEnumerable = fabricaJerarquiaEnumerable;
		}
		/// <summary>
		/// Sobreescritura del método ToString para efectos del manejo del arbol.
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{
			return _jerarquiaCarpeta.Nombre;
		}

		#region IHierarchyData Members

		/// <summary>
		/// Método de la interfaz IHierarchyData para obtener un IHierarchicalEnumerable de 
		/// los hijos del nodo.
		/// </summary>
		/// <returns></returns>
		public IHierarchicalEnumerable GetChildren()
		{
			IJerarquiaCarpetaHierarchicalEnumerable jerarquiaEnumerable = _fabricaJerarquiaEnumerable.Construir();
			List<IEntidadLinqAsociacionJerarquiaPadreHijo> listado = _jerarquiaCarpeta.AsociacionesJerarquiasHijos.ToList();
			
			foreach (IEntidadLinqAsociacionJerarquiaPadreHijo asociacion in listado)
			{
				jerarquiaEnumerable.Add(_fabricaInterna.Construir(asociacion.JerarquiaHijo));
			}
			return jerarquiaEnumerable;

		}

		/// <summary>
		/// Método de la interfaz IHierarchyData para obtener el padre del nodo
		/// </summary>
		/// <returns></returns>
		public IHierarchyData GetParent()
		{
			return _fabricaInterna.Construir(_jerarquiaCarpeta.AsociacionesJerarquiasPadres[0].JerarquiaPadre);
		}

		/// <summary>
		/// Propiedad de la interfaz IHierarchyData para verificar la existencia de hijos
		/// </summary>
		public bool HasChildren
		{
			get
			{
				return _jerarquiaCarpeta.AsociacionesJerarquiasHijos.Count != 0;
			}
		}

		/// <summary>
		/// Propiedad de la interfaz IHierarchyData para obtener el objeto del nodo
		/// </summary>
		public object Item
		{
			get { return _jerarquiaCarpeta; }
		}

		/// <summary>
		/// Propiedad de la interfaz IHierarchyData para obtener la ruta de acceso al nodo.
		/// Se usa en el método GetHierarchicalView del dataSource.
		/// </summary>
		public string Path
		{
			get { return _jerarquiaCarpeta.Id.ToString(); }
		}

		/// <summary>
		/// Propiedad de la interfaz IHierarchyData que obtiene el tipo del objeto del nodo.
		/// No es un objeto fuertemente tipeado, es solo un string.
		/// </summary>
		public string Type
		{
			get 
			{
				return "JerarquiaCarpeta";
			}
		}

		#endregion
	}
}
